package com.junsi.app.common.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * word 处理工具类
 *
 */
public class WordUtil {
	
	private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	/**
	 * 将数据填充xml文件(word模板)之后新增缓存数据
	 * @param dataMap 填充输数据
	 * @param templetFilePath  模板路径
	 * @param response 响应客户端
	 */
	public static String xmlDocLoadData(Map<String,Object> dataMap, String templetFilePath){
		Logger logger = LoggerFactory.getLogger(WordUtil.class);
		//时间戳
		Long time=new Date().getTime();
		// 将模板文件路径拆分为文件夹路径和文件名称
		String tempLetDir = templetFilePath.substring(0,templetFilePath.lastIndexOf(File.separator));
		
		logger.info("tempLetDir="+tempLetDir);
		
		// 注意：templetFilePath.lastIndexOf("/")中，有的文件分隔符为：\ 要注意文件路径的分隔符
		String templetName = templetFilePath.substring(templetFilePath.lastIndexOf(File.separator)+1);
		
		logger.info("templetName="+templetName);
		
		// 将目标文件保存路径拆分为文件夹路径和文件名称
		String targetDir = tempLetDir+File.separator+"cache";
		String targetName = time+"Word.doc";
		
		logger.info("targetDir="+targetDir);
		logger.info("targetName="+targetName);
		
		//将模板和数据模型合并生成文件
		Writer out=null;
		try {
			Configuration configuration = new Configuration();
			configuration.setDefaultEncoding("UTF-8");
			// 如果目标文件目录不存在，则需要创建
			File file = new File(targetDir);
			if(!file.exists()){
				file.mkdirs();
			}
			// 加载模板数据（从文件路径中获取文件，其他方式，可百度查找）
			configuration.setDirectoryForTemplateLoading(new File(tempLetDir));
			// 获取模板实例
			Template template = configuration.getTemplate(templetName);
			String outpath=targetDir + File.separator + targetName;
			File outFile = new File(outpath);
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
			//生成文件,将文件输出到客户端
			template.process(dataMap, out);
			out.flush();
			return outpath;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			if(out!=null)
				try {
					out.close();
				} catch (IOException e) {}
		}
		return null;
	}
	
	/**
	 * 将图片转换成Base64编码 
	 * @param imgFilePath	图片路径
	 * @return
	 * @throws IOException 
	 */ 
	public static String getImgStr(String imgFilePath) throws IOException{
		//将图片文件转化为字节数组字符串，并对其进行Base64编码处理
		InputStream in = null;
		byte[] data = null;
		//读取图片字节数组
			in = new FileInputStream(imgFilePath);        
			data = new byte[in.available()];
			in.read(data);
			in.close();
		return new String(Base64.encodeBase64(data));
	}
	
	/**
	 * 获取各耍日期时间
	 * @param date
	 * @param isTime
	 * @return
	 */
	public static String getDateStr(Date date,boolean isTime){
		if(date==null)
			return null;
		if(isTime){
			return dateTimeFormat.format(date);
		}else{
			return dateFormat.format(date);
		}
	}
}
